-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feature] Headcrabs #190
base: master
Are you sure you want to change the base?
[Feature] Headcrabs #190
Conversation
Warning Rate limit exceeded@PuroSlavKing has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 25 minutes and 47 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (1)
ОбзорЭтот pull request добавляет новую систему "Headcrab" в игру, включающую компоненты, системы, прототипы сущностей, локализацию и ресурсы для различных типов хедкрабов. Изменения охватывают серверную логику, игровые механики, визуальные ресурсы и многоязычную поддержку. Изменения
Рекомендуемые рецензенты
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
RSI Diff Bot; head commit c0dab27 merging into 82174d3 Resources/Textures/_White/Interface/Actions/headcrab.rsi
Resources/Textures/_White/Mobs/Animals/headcrab.rsi
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Nitpick comments (19)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)
1-30
: Рекомендация: убрать дублирование подключений
ТипContent.Server.NPC.Components
импортируется как в строке 3, так и в строке 7. Это потенциально избыточно и может быть упрощено, чтобы избежать путаницы.
127-137
: Реализация укуса при экипировке в руку (OnGotEquippedHand)
Код корректно проверяет, жив ли хедкраб, не является ли пользователь зомби, а затем наносит урон и отображает всплывающие сообщения. Можно рассмотреть единообразие поведения с другими методами экипировки, но в целом решение работает.Resources/Locale/en-US/_white/popups/headcrab.ftl (2)
4-5
: Обратите внимание на согласованность использования заглавных букв при работе с плейсхолдерами.Вместо
{ CAPITALIZE($entity) }
можно рассмотреть более гибкий способ форматирования, если потребуется отображать другие элементы строки в верхнем регистре. В остальном логика корректна.
11-11
: Уточните формулировку «You cant take headcrab off your head.»Добавьте апостроф в слове "can't" для корректного написания.
- headcrab-try-unequip = You cant take headcrab off your head. + headcrab-try-unequip = You can't take headcrab off your head.Content.Server/_White/Headcrab/HeadcrabComponent.cs (3)
21-23
: Проверьте возможную опечатку в названии переменной «ChansePounce».Может имелось в виду «ChancePounce»? Уточните для единообразия и читаемости кода.
- public int ChansePounce = 33; + public int ChancePounce = 33;
28-28
: Именование флага IsDeath может сбивать с толку.Обычно в подобных случаях используется
IsDead
. Переименуйте для большей ясности.- public bool IsDeath = false; + public bool IsDead = false;
30-30
: Переменная EquipedOn может содержать ошибку правописания.Рекомендуется заменить на
EquippedOn
для согласованности.- public EntityUid EquipedOn; + public EntityUid EquippedOn;Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json (1)
9-32
: Проверка состояний спрайтаРекомендуется добавить дополнительные состояния анимации:
- Состояние прыжка (jumping)
- Состояние приземления (landing)
- Состояние атаки (attacking)
Это улучшит визуальную обратную связь для игроков.
Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml (2)
2-3
: Форматирование заголовкаРекомендуется использовать теги форматирования для заголовка:
- # Быстрый хедкраб + <Box> + <Heading>Быстрый хедкраб</Heading> + </Box>
15-17
: Форматирование характеристикРекомендуется использовать список с маркерами для лучшей читаемости:
- - Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении. - - Имеет 50 ХП. - - Передвигается на 20% быстрее. + <Box> + <GuideReagentEmbed Reagent="Damage"/> + <List> + <ListItem>Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении.</ListItem> + <ListItem>Имеет 50 ХП.</ListItem> + <ListItem>Передвигается на 20% быстрее.</ListItem> + </List> + </Box>Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml (1)
11-17
: Рекомендуется усилить уязвимость к огнюДля биологической сущности урон от огня (10) кажется заниженным. Рекомендуется увеличить урон от огня для баланса.
- type: Flammable fireSpread: true damage: types: - Heat: 10 + Heat: 25Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml (1)
1-55
: Рекомендуется добавить условия спавнаТекущая реализация спавнеров не учитывает условия окружающей среды. Рекомендуется добавить проверки для более сбалансированного геймплея.
Предлагаемые дополнения для каждого спавнера:
- type: ConditionalSpawner prototypes: - HeadcrabNest + conditions: + - !type:AmbientTemperature + min: 280 + max: 320 + - !type:NotInSpace + - !type:Distance + target: Players + minimum: 10Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml (2)
13-17
: Рекомендуется дополнить информацию о механикахВ разделе особенностей следует добавить информацию о контрмерах и тактике борьбы с ядовитыми хедкрабами.
## Особенности - Наносит [color=#46A446]2 яда[/color] своими челюстями, в том числе при закреплении. - Имеет 50 ХП. - Передвигается на 40% медленее. + - [color=#FF0000]Внимание:[/color] Уязвим к: + - Огнестрельному оружию + - Энергетическому оружию + - Взрывчатке + - [color=#FFD700]Совет:[/color] Держитесь на расстоянии и атакуйте группой
2-2
: Рекомендуется использовать стандартный формат заголовка- # Ядовитый хедкраб + <Title>Ядовитый хедкраб</Title>Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml (1)
4-6
: Рекомендуется улучшить форматирование документацииДля улучшения читаемости рекомендуется:
- Добавить атрибут Scale для GuideEntityEmbed
- Добавить описательный Caption
<Box> - <GuideEntityEmbed Entity="MobHeadcrab" Caption=""/> + <GuideEntityEmbed Entity="MobHeadcrab" Scale="1.5" Caption="Обычный хедкраб"/> </Box>Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (4)
33-33
: Рекомендации по балансировке параметровТекущие параметры могут сделать хедкрабов слишком сильными:
- Время паралича (3 секунды) кажется слишком коротким
- Базовая скорость передвижения (2.9/3.9) выглядит высокой
Рекомендуется протестировать следующие значения:
- paralyzeTime: 3 + paralyzeTime: 5 - baseWalkSpeed: 2.9 - baseSprintSpeed: 3.9 + baseWalkSpeed: 2.5 + baseSprintSpeed: 3.5Also applies to: 86-87
115-117
: Раскомментируйте секцию GuideHelpДокументация важна для понимания механик игры. Рекомендуется раскомментировать секцию GuideHelp для базового хедкраба.
-# - type: GuideHelp -# guides: -# - Headcrab + - type: GuideHelp + guides: + - Headcrab
144-151
: Усильте урон ядовитого хедкрабаТекущий урон от яда (2 единицы) кажется слишком низким для специализированного ядовитого варианта хедкраба.
damage: types: - Poison: 2 + Poison: 4 - type: MeleeWeapon damage: types: - Poison: 2 + Poison: 4
1-157
: Исправьте проблемы с отступамиСтатический анализ выявил несколько проблем с отступами в файле. Рекомендуется использовать консистентные отступы по 4 пробела для всех уровней вложенности.
🧰 Tools
🪛 yamllint (1.35.1)
[warning] 16-16: wrong indentation: expected 4 but found 2
(indentation)
[error] 20-20: trailing spaces
(trailing-spaces)
[warning] 90-90: wrong indentation: expected 6 but found 4
(indentation)
[warning] 95-95: wrong indentation: expected 6 but found 4
(indentation)
[warning] 97-97: wrong indentation: expected 6 but found 4
(indentation)
[warning] 111-111: wrong indentation: expected 4 but found 2
(indentation)
[warning] 124-124: wrong indentation: expected 4 but found 2
(indentation)
[warning] 140-140: wrong indentation: expected 4 but found 2
(indentation)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (21)
Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg
is excluded by!**/*.ogg
Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/dead.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-vox.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-vox.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/alive.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/alive.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png
is excluded by!**/*.png
Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png
is excluded by!**/*.png
Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/icon.png
is excluded by!**/*.png
📒 Files selected for processing (31)
Content.Server/_White/Headcrab/HeadcrabComponent.cs
(1 hunks)Content.Server/_White/Headcrab/HeadcrabSystem.cs
(1 hunks)Content.Shared/_White/Headcrab/SharedHeadcrab.cs
(1 hunks)Resources/Locale/en-US/_white/popups/headcrab.ftl
(1 hunks)Resources/Locale/en-US/_white/prototypes/actions/types.ftl
(1 hunks)Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl
(1 hunks)Resources/Locale/ru-RU/_white/guidbook/main.ftl
(1 hunks)Resources/Locale/ru-RU/_white/popups/headcrab.ftl
(1 hunks)Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl
(1 hunks)Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl
(1 hunks)Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl
(1 hunks)Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl
(1 hunks)Resources/Prototypes/_White/Actions/types.yml
(1 hunks)Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml
(1 hunks)Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml
(1 hunks)Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml
(1 hunks)Resources/Prototypes/_White/GameRules/events.yml
(1 hunks)Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml
(1 hunks)Resources/Prototypes/_White/Guidebook/WWDP.yml
(1 hunks)Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml
(1 hunks)Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml
(1 hunks)Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml
(1 hunks)Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml
(1 hunks)Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml
(1 hunks)Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml
(1 hunks)Resources/ServerInfo/_White/Guidebook/WWDP.xml
(1 hunks)Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json
(1 hunks)Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json
(1 hunks)Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json
(1 hunks)Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json
(1 hunks)Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json
(1 hunks)
✅ Files skipped from review due to trivial changes (12)
- Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json
- Resources/ServerInfo/_White/Guidebook/WWDP.xml
- Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml
- Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json
- Resources/Locale/ru-RU/_white/guidbook/main.ftl
- Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl
- Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json
- Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml
- Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl
- Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json
- Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl
- Resources/Locale/ru-RU/_white/popups/headcrab.ftl
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml
[warning] 16-16: wrong indentation: expected 4 but found 2
(indentation)
[error] 20-20: trailing spaces
(trailing-spaces)
[warning] 90-90: wrong indentation: expected 6 but found 4
(indentation)
[warning] 95-95: wrong indentation: expected 6 but found 4
(indentation)
[warning] 97-97: wrong indentation: expected 6 but found 4
(indentation)
[warning] 111-111: wrong indentation: expected 4 but found 2
(indentation)
[warning] 124-124: wrong indentation: expected 4 but found 2
(indentation)
[warning] 140-140: wrong indentation: expected 4 but found 2
(indentation)
🔇 Additional comments (36)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (11)
33-46
: Проверка зависимостей
Зависимости, помеченные атрибутом [Dependency]
, корректно инициализируются и последовательно используются в методах системы.
47-58
: Подписка на события
Метод Initialize()
логично регистрирует локальные события, необходимые для работы HeadcrabSystem. Подход к подпискам выглядит систематичным и ясным.
60-63
: Добавление экшена
OnStartup
корректно добавляет действие JumpAction к сущности. Рекомендуется проверить, что component.JumpAction
не равен null
, чтобы избежать потенциальных исключений.
65-103
: Логика при попадании хедкраба (OnHeadcrabDoHit)
Метод в целом выглядит логичным: проверяется, что цель не является зомби и что она жива, затем выполняется экипировка хедкраба в слот «mask». Однако стоит убедиться, что у цели не занят слот маски другим предметом (помимо IngestionBlockerComponent
) для более полной валидации.
105-112
: Слоты и фракции при экипировке
Когда хедкраб экипирован, компонент автоматически добавляет фракцию «Zombie». Это поведение выглядит обоснованным в игровом контексте, и логика корректна.
114-125
: Запрет на снятие хедкраба
Метод OnUnequipAttempt
грамотно предотвращает снятие, если носитель не является зомби, уведомляя игрока всплывающим сообщением. Логика отмены попытки здесь выглядит последовательно.
139-149
: Логика при снятии (OnGotUnequipped)
При удалении хедкраба из слота «mask» корректно сбрасывается состояние Pacified и переводится сущность в боевой режим. Удаление фракции «Zombie» уместно и понятно.
151-197
: Обработка удара в бою (OnMeleeHit)
Метод правильно обрабатывает вероятность «ChansePounce» и экипировку хедкраба на голову жертвы. Проверка на живое состояние цели перед экипировкой тоже реализована верно.
199-205
: Состояние смерти (OnMobStateChanged)
Если моб умирает, флаг IsDeath
в компоненте устанавливается в true
. Простое и эффективное решение, соответствующее требованиям игровой логики.
206-221
: Прыжок (OnJump)
Метод аккуратно обрабатывает действие прыжка, рассчитав направление и силу. При наличии звука прыжка он проигрывается локально. Логика выглядит завершённой.
223-255
: Циклическое нанесение урона (Update)
Метод учитывает внутренний счётчик (Accumulator), и при превышении DamageFrequency
наносит урон носителю хедкраба с помощью _damageableSystem
. Также корректно удаляет хедкраба, если носитель мёртв. Реализация обновления в целом адекватна.
Resources/Locale/en-US/_white/prototypes/actions/types.ftl (1)
1-2
: Локализация: действия для прыжка
Добавленные строки jump-action-name
и jump-action-description
корректно описывают действие «Jump». Сам текст выглядит понятным и соответствует назначению.
Content.Shared/_White/Headcrab/SharedHeadcrab.cs (1)
1-10
: Новый класс JumpActionEvent
Класс JumpActionEvent
унаследован от WorldTargetActionEvent
и готов к сериализации. Дополнительных проблем не обнаружено.
Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl (1)
1-9
: Локализация: типы хедкрабов
Добавлены корректные строки локализации, описывающие базового хедкраба и его варианты (быстрый, ядовитый). Формат Fluent соблюдён, семантика описаний понятна.
Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl (1)
12-14
: Локализация для прыжка
Добавлены строки jump-action-name
и jump-action-description
на русском языке. Текст точный и соответствует действию «Прыгнуть».
Resources/Locale/en-US/_white/popups/headcrab.ftl (3)
1-2
: Название и описание выглядят корректно.
Похоже, что строки хорошо согласуются по смыслу с функционалом headcrab и не требуют корректировок.
7-7
: Строка с использованием { CAPITALIZE($entity) }.
Похоже, что она согласуется с предыдущими строками. Нет критических замечаний.
9-9
: Уведомление о том, что headcrab кусает руку, кажется верным.
Связь с игровым событием выглядит логичной.
Content.Server/_White/Headcrab/HeadcrabComponent.cs (8)
1-5
: Проверка импорта.
Импорты выглядят релевантными, лишних или пропущенных не замечено.
8-10
: Объявление класса HeadcrabComponent.
Сама структура класса верна, атрибуты [Access(...)]
и [RegisterComponent]
используются по назначению.
12-16
: Проверьте использование поля JumpAction во внешнем коде.
Логика определения экшенов через PrototypeIdSerializer
корректна. Убедитесь, что внешний код действительно вызывает ActionHeadcrabJump
.
18-19
: Параметр ParalyzeTime.
Установлено значение по умолчанию 3 секунды, что кажется разумным для оглушения.
24-26
: Параметр Damage выглядит корректно.
Требуемое поле со спецификатором урона. Нет замечаний.
32-32
: Параметр Accumulator.
Нет замечаний: используется стандартная логика накопления.
34-36
: Параметр DamageFrequency.
Имеет разумное значение по умолчанию (5).
37-38
: Звуковой эффект HeadcrabJumpSound.
Значение по умолчанию задано корректно. Нет проблем.
Resources/Prototypes/_White/Guidebook/WWDP.yml (1)
1-6
: Новый раздел guideEntry с полем children, содержащим WhiteAntagonist.
Прототип выглядит логичным для организации справочной информации. Нет дополнительных замечаний.
Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml (2)
3-9
: Раздел WhiteAntagonist с дочерним элементом Headcrabs.
Структура YAML корректна, связанный файл Antagonist.xml указан верно.
12-19
: Новый раздел Headcrabs содержит три варианта: Headcrab, HeadcrabFast и HeadcrabPoison.
Логика организации нескольких разновидностей headcrab внутри одного блока кажется удобной и расширяемой.
Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml (1)
1-14
: Проверка наличия файлов руководства
Структура записей корректна, но необходимо убедиться в наличии всех XML файлов руководства.
✅ Verification successful
Все файлы руководства присутствуют и корректно размещены
Проверка показала, что все необходимые XML-файлы руководства для хедкрабов существуют по указанным путям:
- Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml
- Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml
- Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if all referenced XML files exist
for file in \
"ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml" \
"ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml" \
"ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml"
do
if [ ! -f "Resources/$file" ]; then
echo "Missing file: $file"
fi
done
Length of output: 1032
Script:
#!/bin/bash
# Let's try using fd to find XML files related to headcrabs
fd -e xml -p "Headcrab.*\.xml$" Resources/ServerInfo
Length of output: 379
Script:
#!/bin/bash
# Also check the general structure of ServerInfo directory
fd . Resources/ServerInfo
Length of output: 8412
Script:
#!/bin/bash
# Check if the directory exists
ls -la Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/ 2>/dev/null || echo "Directory not found"
Length of output: 384
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json (1)
3-4
: Проверка лицензии и авторских прав
Лицензия CC-BY-SA-3.0 указана корректно. Информация об авторских правах содержит ссылку на исходный код и редактора.
Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml (1)
11-11
: Проверка баланса игры
Дальность прыжка 5-10 метров может быть слишком большой для игрового баланса. Рекомендуется провести тестирование и возможно уменьшить это значение.
Resources/Prototypes/_White/GameRules/events.yml (1)
48-61
: Проверка конфигурации события HeadcrabInvasion
Параметры события выглядят логичными, но рекомендуется проверить:
- Баланс веса события (8) относительно других событий
- Достаточность времени подготовки (earliestStart: 15)
- Существование прототипа SpawnHeadcrabNest
✅ Verification successful
Конфигурация события HeadcrabInvasion корректна
Проверка показала:
- Прототип SpawnHeadcrabNest существует и корректно настроен для спавна HeadcrabNest
- Вес события (8) соответствует весам других событий в файле (6-8)
- Время подготовки в 15 минут и длительность в 1 минуту являются разумными значениями
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка существования прототипа SpawnHeadcrabNest
rg -l "id:\s*SpawnHeadcrabNest" "Resources/Prototypes"
Length of output: 121
Script:
#!/bin/bash
# Проверяем содержимое файла с прототипом SpawnHeadcrabNest
cat "Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml"
# Проверяем веса других событий для сравнения
rg "weight:\s+\d+" "Resources/Prototypes/_White/GameRules/events.yml" -A 1
Length of output: 1483
Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml (1)
15-17
: Необходима верификация характеристик хедкраба
Указанные характеристики требуют проверки на соответствие реализации:
- Урон: 2 режущего
- Здоровье: 50 ХП
- Скорость: -10%
Resources/Prototypes/_White/Actions/types.yml (1)
59-71
: Проверка конфигурации прыжка хедкраба
Необходимо проверить:
- Существование локализации для "jump-action-name" и "jump-action-description"
- Наличие иконки в указанном пути
- Баланс параметров useDelay и range
✅ Verification successful
Конфигурация прыжка хедкраба корректна
Проверка показала:
- Локализация присутствует в обоих языках (ru-RU и en-US)
- Иконка найдена по указанному пути Resources/Textures/_White/Interface/Actions/headcrab.rsi
- Параметры useDelay (6 секунд) и range (160 единиц) выглядят сбалансированными для механики прыжка
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка локализации и ресурсов
echo "Checking localizations..."
rg "jump-action-(name|description)" "Resources/Locale"
echo "Checking icon existence..."
fd "headcrab.rsi" "Resources"
Length of output: 695
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (1)
129-130
: Проверьте баланс скорости быстрого хедкраба
Увеличение скорости на 0.3 единицы может сделать быстрого хедкраба слишком эффективным в погоне за игроками.
Пожалуйста, протестируйте эти значения в игровых условиях для подтверждения баланса.
Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml
Outdated
Show resolved
Hide resolved
Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Nitpick comments (3)
Content.Server/_White/Headcrab/HeadcrabComponent.cs (1)
24-26
: Требуется документация для параметра DamageДобавьте XML-документацию, описывающую структуру и назначение спецификации урона.
+/// <summary> +/// Определяет типы и количество урона, наносимого хедкрабом +/// </summary> [DataField("damage", required: true)] [ViewVariables(VVAccess.ReadWrite)] public DamageSpecifier Damage = default!;Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)
3-3
: Удалите дублирующийся импортИмпорт
Content.Server.NPC.Components
дублируется.using Content.Server.NPC.Components; using Content.Server.Nutrition.Components; using Content.Server.Nutrition.EntitySystems; using Content.Server.Popups; -using Content.Server.NPC.Components; using Content.Server.NPC.Systems;
Also applies to: 7-7
223-254
: Оптимизируйте метод UpdateМетод Update содержит вложенную логику, которую можно упростить:
- Используйте раннее возвращение для уменьшения уровня вложенности
- Выделите логику обработки урона в отдельный метод
public override void Update(float frameTime) { base.Update(frameTime); + foreach (var comp in EntityQuery<HeadcrabComponent>()) + { + UpdateHeadcrabDamage(comp, frameTime); + } } +private void UpdateHeadcrabDamage(HeadcrabComponent comp, float frameTime) +{ + comp.Accumulator += frameTime; + if (comp.Accumulator <= comp.DamageFrequency) + return; + + comp.Accumulator = 0; + if (comp.EquippedOn is not { Valid: true } targetId) + return; + + if (HasComp<ZombieComponent>(comp.EquippedOn)) + return; + + if (!TryProcessTargetState(comp, targetId)) + return; + + ApplyDamageAndEffects(comp, targetId); +}
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
Content.Server/_White/Headcrab/HeadcrabComponent.cs
(1 hunks)Content.Server/_White/Headcrab/HeadcrabSystem.cs
(1 hunks)Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml
(1 hunks)Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml
[warning] 16-16: wrong indentation: expected 4 but found 2
(indentation)
[error] 20-20: trailing spaces
(trailing-spaces)
[warning] 90-90: wrong indentation: expected 6 but found 4
(indentation)
[warning] 95-95: wrong indentation: expected 6 but found 4
(indentation)
[warning] 97-97: wrong indentation: expected 6 but found 4
(indentation)
[warning] 103-103: wrong indentation: expected 6 but found 4
(indentation)
[warning] 111-111: wrong indentation: expected 4 but found 2
(indentation)
[warning] 117-117: wrong indentation: expected 6 but found 4
(indentation)
[warning] 124-124: wrong indentation: expected 4 but found 2
(indentation)
[warning] 133-133: wrong indentation: expected 6 but found 4
(indentation)
[warning] 140-140: wrong indentation: expected 4 but found 2
(indentation)
[warning] 157-157: wrong indentation: expected 6 but found 4
(indentation)
🔇 Additional comments (1)
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (1)
35-38
: Проверьте баланс параметров урона
Значение урона Piercing: 2
кажется низким для данного типа существа. Рекомендуется пересмотреть баланс урона с учетом игровой механики.
✅ Verification successful
Значение урона соответствует балансу игры
Анализ показывает, что значение урона Piercing: 2
для хедкраба является сбалансированным, учитывая:
- Это базовое существо с относительно высокой скоростью передвижения (2.9/3.9)
- Имеет специальную способность прыжка (jumpAction) и паралича (paralyzeTime: 3)
- Другие варианты хедкрабов (poison) имеют аналогичный урон, но другого типа
- Существо предназначено для массового появления и не должно быть слишком сильным индивидуально
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск других сущностей с похожим уроном для сравнения
rg -A 2 "Piercing:" "Resources/Prototypes/_White/Entities/Mobs/"
Length of output: 572
Script:
#!/bin/bash
# Поиск других типов урона у мобов для сравнения
rg -A 2 "damage:" "Resources/Prototypes/_White/Entities/Mobs/"
Length of output: 965
Script:
#!/bin/bash
# Поиск всех файлов мобов для полного анализа
fd . "Resources/Prototypes/_White/Entities/Mobs/" -e yml -x cat {}
Length of output: 22080
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (1)
156-196
:⚠️ Potential issueОптимизируйте обработку попаданий
Метод
OnMeleeHit
используетreturn
внутри цикла, что может привести к пропуску обработки других целей. Рекомендуется использоватьcontinue
для корректной обработки всех целей.foreach (var entity in args.HitEntities) { if (!HasComp<HumanoidAppearanceComponent>(entity)) - return; + continue; if (TryComp(entity, out MobStateComponent? mobState)) { if (mobState.CurrentState is not MobState.Alive) { - return; + continue; } }
🧹 Nitpick comments (2)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)
3-3
: Удалите дублирующийся импортИмпорт
Content.Server.NPC.Components
объявлен дважды. Удалите дублирующуюся строку.using Content.Server.NPC.Components; -using Content.Server.NPC.Components;
Also applies to: 7-7
90-99
: Оптимизируйте отображение сообщенийТри похожих вызова PopupEntity можно объединить в один метод для уменьшения дублирования кода.
-_popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"), - args.Target, args.Target, PopupType.LargeCaution); - -_popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", - ("entity", args.Target)), - uid, uid, PopupType.LargeCaution); - -_popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", - ("entity", args.Target)), args.Target, Filter.PvsExcept(uid), true, PopupType.Large); +private void ShowHeadcrabAttackPopups(EntityUid headcrab, EntityUid target) +{ + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"), + target, target, PopupType.LargeCaution); + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", ("entity", target)), + headcrab, headcrab, PopupType.LargeCaution); + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", ("entity", target)), + target, Filter.PvsExcept(headcrab), true, PopupType.Large); +}
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
Content.Server/_White/Headcrab/HeadcrabSystem.cs
(1 hunks)Content.Shared/_White/Headcrab/SharedHeadcrab.cs
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- Content.Shared/_White/Headcrab/SharedHeadcrab.cs
🔇 Additional comments (2)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)
47-58
: Подписки на события корректны
Метод Initialize правильно подписывается на все необходимые события для работы хедкраба.
238-240
:
Исправьте поток управления
Использование return
вместо continue
приведет к преждевременному выходу из метода Update
и пропуску обработки остальных сущностей.
if (HasComp<ZombieComponent>(comp.EquippedOn))
- return;
+ continue;
Likely invalid or redundant comment.
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (4)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (4)
77-88
: Заблокированная попытка снять хедкраба.
Текущая логика правильно отменяет снятие при исполнении ряда условий, однако стоит явно сообщать игрокам причины отмены (например, если зомби). Сейчас всплывающее сообщение одно для всех случаев.
90-104
: Проверка смерти и состояния приведения дублируется.
В методеOnGotEquippedHand
есть две одинаковые проверки_mobState.IsDead(uid) || HasComp<ZombieComponent>(args.User)
. Можно объединить их в один блок, чтобы упростить код и повысить читаемость.
140-142
: Случайный шанс на прыжок.
Использование_random.Next(1, 101) <= component.ChancePounce
корректно, но если вы планируете расширять механику, лучше вынести генерацию шанса в отдельный метод и покрыть тестами.
144-146
: Избыточная двойная проверка.
Сначала мы делаемTryEquip
, а позже опять проверяем условия для экипировки. Есть риск дублирования логики. Объедините эти проверки, чтобы избежать путаницы.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png
is excluded by!**/*.png
Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png
is excluded by!**/*.png
📒 Files selected for processing (7)
Content.Server/_White/Headcrab/HeadcrabComponent.cs
(1 hunks)Content.Server/_White/Headcrab/HeadcrabSystem.cs
(1 hunks)Resources/Locale/en-US/_white/station-events/events/events.ftl
(1 hunks)Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl
(1 hunks)Resources/Locale/ru-RU/_white/station-events/events/events.ftl
(1 hunks)Resources/Prototypes/_White/Actions/types.yml
(1 hunks)Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
- Resources/Prototypes/_White/Actions/types.yml
- Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json
- Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl
- Content.Server/_White/Headcrab/HeadcrabComponent.cs
🔇 Additional comments (3)
Resources/Locale/en-US/_white/station-events/events/events.ftl (1)
4-4
: Добавление нового сообщения о нашествии хедкрабов выглядит корректно.
Рекомендуется проверить, что соответствующее событие успешно регистрируется и вызывается при необходимых условиях в игровом процессе.
Resources/Locale/ru-RU/_white/station-events/events/events.ftl (1)
4-4
: Новое сообщение о нашествии хедкрабов добавлено правильно.
Убедитесь, что текст полностью покрывает геймплейную механику и находится в синхронизации с английской версией, чтобы избежать несоответствий.
Content.Server/_White/Headcrab/HeadcrabSystem.cs (1)
68-75
: Проверяйте нейтральность поведения существа.
В OnGotEquipped
добавляется PacifiedComponent
при одевании на слот "mask". Если хедкрабу нужно сохранять агрессивное поведение или способность к атаке, стоит убедиться, что этот компонент снимается при возвращении к бою.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (3)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (3)
115-163
:⚠️ Potential issueОптимизируйте метод OnMeleeHit
В методе есть несколько проблем:
- Использование
return
вместоcontinue
в цикле прерывает обработку остальных сущностей- Дублирование кода проверок с другими методами
Рекомендуется:
- Заменить
return
наcontinue
- Вынести повторяющиеся проверки в отдельный метод
- if (!HasComp<HumanoidAppearanceComponent>(entity)) - return; + if (!HasComp<HumanoidAppearanceComponent>(entity)) + continue; - private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEvent args) + private bool CanAttachToTarget(EntityUid headcrab, EntityUid target, HeadcrabComponent component) + { + return HasComp<HumanoidAppearanceComponent>(target) + && _mobState.IsAlive(target) + && !HasComp<ZombieComponent>(target) + && !_mobState.IsDead(headcrab); + }
199-204
:⚠️ Potential issueИсправьте преждевременный выход из цикла
Использование
return
вместоcontinue
приводит к преждевременному завершению обработки всех хедкрабов. Это может привести к пропуску обновления состояния других хедкрабов.if (!_mobState.IsAlive(targetId)) { _inventory.TryUnequip(targetId, "mask", true, true); comp.EquippedOn = EntityUid.Invalid; - return; + continue; }
206-206
: 🛠️ Refactor suggestionДобавьте обработку результата TryChangeDamage
Необходимо проверять результат вызова TryChangeDamage для корректной обработки случаев, когда урон не может быть применен.
- _damageableSystem.TryChangeDamage(targetId, comp.Damage); + if (!_damageableSystem.TryChangeDamage(targetId, comp.Damage, out var appliedDamage)) + { + _popup.PopupEntity(Loc.GetString("headcrab-damage-resist"), targetId); + }
🧹 Nitpick comments (1)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (1)
38-50
: Добавьте проверку зависимостейРекомендуется добавить проверку инжектированных зависимостей в конструкторе системы для предотвращения NullReferenceException во время выполнения.
+ public HeadcrabSystem() + { + ArgumentNullException.ThrowIfNull(_transform); + ArgumentNullException.ThrowIfNull(_stunSystem); + // ... проверки для остальных зависимостей + }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
Content.Server/_White/Headcrab/HeadcrabSystem.cs
(1 hunks)
🔇 Additional comments (1)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (1)
175-177
: Вынесите магические числа в константы
Значения 7F и 10F следует объявить как именованные константы для улучшения читаемости и поддерживаемости кода.
+ private const float THROW_SPEED = 7f;
+ private const float THROW_ANGULAR_VELOCITY = 10f;
- _throwing.TryThrow(uid, direction, 7F, uid, 10F);
+ _throwing.TryThrow(uid, direction, THROW_SPEED, uid, THROW_ANGULAR_VELOCITY);
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Co-authored-by: Spatison <[email protected]>
Описание PR
Супер крутые хедкраби!!!
Code elements taken from: Rxup/space-station-14#194
Медиа
Список
Изменения
🆑 PuroSlavKing & Spatison